﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace sir_mix_csharp.entidades
{
    /// <summary>
    /// Classe que representa um registro de interesse (compra ou venda) em uma ação.
    /// </summary>
    public class RegistroInteresse
    {
        private Acao acao;
        private double preco; //ou máximo ou mínimo
        private double prazo;
        private string tempoInicial;
        //private ICliente cliente;

        /// <summary>
        /// Construtor da classe, que já instancia o objeto passando os parâmetros iniciais.
        /// </summary>
        /// <param name="acao">acao que o registro de interesse se refere.</param>
        /// <param name="prazo">prazo máximo que o registro de interesse permanecerá no  servidor.</param>
        /// <param name="preco">preço (máximo ou mínimo) que a ação vai ser transacionada.</param>
        public RegistroInteresse(Acao acao, double prazo, double preco)
        {
            this.acao = acao;
            this.prazo = prazo;
            this.preco = preco;
            this.tempoInicial = CurrentTimeMillis();
        }

        /// <summary>
        /// Método que retorna a ação.
        /// </summary>
        /// <returns>ação do registro de interesse.</returns>
        public Acao getAcao()
        {
            return acao;
        }

        /// <summary>
        /// Método que altera a ação.
        /// </summary>
        /// <param name="acao">ação a ser alterada.</param>
        public void setAcao(Acao acao)
        {
            this.acao = acao;
        }

        /// <summary>
        /// Método que retorna o prazo do registro de interesse.
        /// </summary>
        /// <returns>prazo máximo do registro de interesse.</returns>
        public double getPrazo()
        {
            return prazo;
        }

        /// <summary>
        /// Método que altera o prazo do registro de interesse.
        /// </summary>
        /// <param name="prazo">prazo máximo do registro de interesse.</param>
        public void setPrazo(double prazo)
        {
            this.prazo = prazo;
        }

        /// <summary>
        /// Método que retorna o preço (máximo ou mínimo) do registro de interesse.
        /// </summary>
        /// <returns>preço (máximo ou mínimo) do registro de interesse.</returns>
        public double getPreco()
        {
            return preco;
        }

        /// <summary>
        /// Método que altera o preço (máximo ou mínimo) do registro de interesse. 
        /// </summary>
        /// <param name="preco">preço (máximo ou mínimo) do registro de interesse.</param>
        public void setPreco(double preco)
        {
            this.preco = preco;
        }

        /// <summary>
        /// Método sincronizado que retorna o tempo incial que o interesse foi registrado. Utilizado para identificar unicamente cada registro. 
        /// </summary>
        /// <returns>tempo incial do registro de interesse.</returns>
        public string getTempoInicial()
        {
            return tempoInicial;
        }

        /// <summary>
        /// Método sincronizado que altera o tempo incial que o interesse foi registrado. Utilizado para identificar unicamente cada registro.
        /// </summary>
        /// <param name="tempoInicial">tempoInicial tempo incial do registro de interesse.</param>
        public void setTempoInicial(string tempoInicial)
        {
            this.tempoInicial = tempoInicial;
        }

        private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

        public static string CurrentTimeMillis()
        {
            return (DateTime.UtcNow - Jan1st1970).TotalMilliseconds.ToString();
        }
    }
}
